chore(0.83): prepare stable 0.83.0 with React Native 0.83.10 - #3022
Saad Najmi (Saadnajmi) wants to merge 118 commits into
Conversation
Summary: Pull Request resolved: react#54385 Changelog: [Internal] `test-release-local` shouldn't be changing the hermes version stored in `version.properties` as this script should be called on a cut branch with hermes already bumped. Reviewed By: cipolleschi Differential Revision: D86105703 fbshipit-source-id: 5a1edd9f7a6cd756521749c2b0023ea683dadf82
#publish-packages-to-npm&next
Summary: Pull Request resolved: react#54419 Changelog: [Internal] React Native uses `files` field in `package.json` to list everything that should end up in the apckage. `.hermesv1version` file was missing from that list, which is fixed by this diff. Reviewed By: huntie, cipolleschi Differential Revision: D86295805 fbshipit-source-id: 8a17191f26f9536884e4aaf09447121c020d1212
…eact#54421) Summary: OSS community shared with me that we have a circular dependency in React-utils.podspec that prevent them from building with JSC. While fixing it, I realized that the dynamic framework build was broken. So I fixed them both. ## Changelog: [iOS][Fixed] - Fixed build with dynamic frameworks Pull Request resolved: react#54421 Test Plan: Build RNTester locally with USE_FRAMEWORKS=dynamic Reviewed By: javache Differential Revision: D86309592 Pulled By: cipolleschi fbshipit-source-id: f2995332ae135ce951480b353df7d597ff8a85ec
Summary: When RCT_SYMBOLICATE_PREBUILT_FRAMEWORKS is enabled, source file paths in dSYMs were incorrectly resolved with extra path segments: double node_modules (e.g., /path/node_modules/node_modules/...) The root cause was using File.expand_path(@react_native_path) without the correct base directory. The path was first expanded without a base (causing double node_modules), then fixed to use project_pods_root (ios/Pods/), which still resulted in incorrect paths with an extra ios/ folder. Fixed by expanding the path relative to Pod::Config.instance.installation_root, which correctly points to the ios/ directory, allowing relative paths like ../node_modules/react-native to resolve properly to the project root's node_modules directory. ## Changelog: [IOS] [FIXED] - Fix incorrect source path resolution in dSYM remapping in precompiled framework scripts Pull Request resolved: react#54470 Test Plan: ``` rm -rf ./Pods pod cache clean --all RCT_USE_RN_DEP=1 RCT_USE_PREBUILT_RNCORE=1 RCT_SYMBOLICATE_PREBUILT_FRAMEWORKS=1 bundle exec pod install ``` ✅ Tested with RN-Tester ✅ Tested in 0.83.rc0 project Reviewed By: huntie Differential Revision: D86667786 Pulled By: cipolleschi fbshipit-source-id: cd6279d02d5ed7188e282e4491c05de35f17a8f1
Summary: Pull Request resolved: react#54479 Fixes failing CI jobs on `0.83-stable`, e.g. https://github.com/facebook/react-native/actions/runs/19234912061/job/54982161510. **Changes** - Simplify main package `package.json` file read with existing `getWorkspaceRoot` util. - Fix test by mocking `getWorkspaceRoot` (previously: read the real filesystem and caused test breakage outside `main`). - Add additional `RC0 → RC1` test case. Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D86674348 fbshipit-source-id: 0b8feb4cbf7b1ac7cf4cc560f066a0a10aec1b5f
Summary: Pull Request resolved: react#54407 Introduces a new `InspectorSystemState` object and `ReactNativeApplication.systemStateChanged` CDP event, used to assert whether more than one React Native Host has been registered for the current app lifetime. This will be used to disable the Performance and Network features in React Native DevTools when the debugger backend is in this currently unsupported state. We intend to implement host lifecycle correctness across all features soon. Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D86201689 fbshipit-source-id: b8525359fc01eb7ae666879f2c0fd4c94f0af81a
…act#54408) Summary: Pull Request resolved: react#54408 Follows from the parent commit. This will prevent 3P CDP clients from using the `Tracing` or `Network` domains when we are in an unsupported multi React Native Host setup. Changelog: [Internal] Reviewed By: hoxyq Differential Revision: D86201688 fbshipit-source-id: 052d563a371fd77c1a05ad8518e222d6bc1eb372
Local sync from 0.83-stable branch
#publish-packages-to-npm&next
Summary: Pull Request resolved: react#54454 Changelog: [Internal] - Add feature flag around IntersectionObserver for canary Reviewed By: rubennorte, cipolleschi Differential Revision: D86547485 fbshipit-source-id: 0c6d84e276d1f6337a8da0bea141cc371010cd75
…0.83-stable branch. Changelog: [General][Added] - React Native DevTools: Enable Network inspection features
#publish-packages-to-npm&next
#publish-packages-to-npm&next
| @@ -4,6 +4,6 @@ | |||
| "baseBranch": "origin/main", | |||
There was a problem hiding this comment.
This should be 0.83-stable, correct?
There was a problem hiding this comment.
Correct. The current 0.83 candidate uses origin/0.83-stable; the shared-main configuration uses origin/main. The base-resolution helper supports both local refs and the repository's configured remotes.
Verified at 88195ce and the shared forward-port in #3099. The current #3022 PR workflow, including its Changesets check, passed: https://github.com/microsoft/react-native-macos/actions/runs/35771943332
Release tracking: #3098.
| const { dependencies, peerDependencies } = manifest; | ||
| const { peerDependencies } = manifest; | ||
|
|
||
| exportValue("react_version", peerDependencies["react"]); | ||
| exportValue("react_native_version", coerce(dependencies["@react-native/codegen"])); | ||
| exportValue("react_native_version", coerce(peerDependencies["react-native"])); |
There was a problem hiding this comment.
From dbb0b39
This should be a macOS tag, and/or also land in main
There was a problem hiding this comment.
The reusable version-export correction is now submitted to main in #3099. It is also included in this 0.83 branch.
This output selects the upstream React Native major/minor used for compatibility and build inputs: it reads the explicit RN peer on stable releases and falls back to the codegen workspace version on development/fork-point branches. It does not select the npm publication dist-tag. The separate publication contract chooses latest, the older stable branch tag, or next, and skips existing versions without mutating tags.
The shared-main PR workflow passed at 9b59f96: https://github.com/microsoft/react-native-macos/actions/runs/35771931455 . #3099 still needs approval and merge; this does not claim the change has already landed in main.
| node ../app/scripts/internal/set-react-version.mts ${{ steps.versions.outputs.react_native_version }} --overrides '{ "react-native-macos": "file:${{ runner.temp }}/react-native-macos.tgz" }' | ||
| node ../app/scripts/internal/set-react-version.mts ${{ steps.versions.outputs.react_native_version }} --overrides '{ "react-native-macos": "file:${{ runner.temp }}/react-native-macos.tgz", "@react-native-macos/virtualized-lists": "file:${{ runner.temp }}/virtualized-lists.tgz" }' | ||
|
|
||
| - name: Pin @types/react to avoid duplicate react-native-macos | ||
| - name: Pin dependencies to avoid resolution conflicts | ||
| working-directory: react-native-test-app | ||
| run: | | ||
| # The test app tree carries both @types/react 19.1.x (example-macos) | ||
| # and 19.2.x (app), both satisfying react-native-macos's peer. Under | ||
| # Yarn's pnpm nodeLinker this virtualizes react-native-macos twice and | ||
| # trips the metro duplicate-dependency checker. Pin to a single version. | ||
| # 1. The test app tree carries both @types/react 19.1.x (example-macos) | ||
| # and 19.2.x (app), both satisfying react-native-macos's peer. Under | ||
| # Yarn's pnpm nodeLinker this virtualizes react-native-macos twice and | ||
| # trips the metro duplicate-dependency checker. Pin to a single version. | ||
| # 2. The packed react-native-macos depends on the unpublished | ||
| # @react-native-macos/virtualized-lists@1000.0.0; --overrides only covers | ||
| # the direct react-native-macos dep, so force the transitive one here. | ||
| node -e " | ||
| const fs = require('fs'); | ||
| const root = JSON.parse(fs.readFileSync('package.json', 'utf8')); | ||
| root.resolutions = root.resolutions || {}; | ||
| root.resolutions['@types/react'] = '~19.1.0'; | ||
| root.resolutions['@react-native-macos/virtualized-lists'] = 'file:${{ runner.temp }}/virtualized-lists.tgz'; |
There was a problem hiding this comment.
These should also be cherry-picked to main. Maybe on a gh stack "fixes from 0.83-stable"
There was a problem hiding this comment.
Submitted the shared local-tarball and transitive-resolution fixes to main in #3099, which is first in the stack tracked by #3098. The implementation is present in both current candidates.
The test-app workflow consumes the local RNM and virtualized-lists tarballs, so it does not depend on those versions having been published. Both public packages in this release are 0.83.0, with RN compatibility 0.83.10. The earlier offline-registry blocker has been resolved: all five release consumers passed, and the current #3022 PR workflow—including test-app integration—passed: https://github.com/microsoft/react-native-macos/actions/runs/35771943332 .
| working-directory: packages/react-native | ||
| run: | | ||
| set -eox pipefail | ||
| # Use a tarball instead of a direct path to avoid symlinks | ||
| yarn pack -o ${{ runner.temp }}/react-native-macos.tgz | ||
| # Use tarballs instead of direct paths to avoid symlinks. The | ||
| # @react-native-macos/virtualized-lists workspace dependency is not | ||
| # published at the 1000.0.0 dev version, so pack and install it too. | ||
| (cd packages/react-native && yarn pack -o ${{ runner.temp }}/react-native-macos.tgz) | ||
| (cd packages/virtualized-lists && yarn pack -o ${{ runner.temp }}/virtualized-lists.tgz) | ||
|
|
||
| - name: Install local react-native-macos | ||
| working-directory: ${{ runner.temp }}/testcli | ||
| run: | | ||
| set -eox pipefail | ||
| npm install ${{ runner.temp }}/react-native-macos.tgz | ||
| npm install ${{ runner.temp }}/virtualized-lists.tgz ${{ runner.temp }}/react-native-macos.tgz |
There was a problem hiding this comment.
similar comment about upstream cherry pick here
There was a problem hiding this comment.
The corresponding init/workflow fixes are included in the shared forward-port PR #3099 as well as this branch.
Registry-based init is intentionally gated on a published RNM version in the target minor; a registry lookup error fails the check rather than being treated as an unpublished version. That publication prerequisite does not apply to local-tarball test-app integration, which runs before publication.
The current #3022 PR workflow passed. Init against the newly published 0.83.0 remains an explicit post-publication check in #3098; no package publication has occurred yet.
| #if !TARGET_OS_OSX // [macOS] This screenshot-capturing observer relies on UIKit-only APIs | ||
| // (UIScene/UIWindowScene/UIGraphicsImageRenderer/drawViewHierarchyInRect) and is | ||
| // only instantiated on iOS (see RCTHost.mm, guarded by TARGET_OS_IPHONE). Provide a | ||
| // no-op stub on macOS below so React-Core still compiles. |
There was a problem hiding this comment.
We have a shim for UIGraphicsImageRenderer, RCTUIGraphicsImageRenderer. We should consider a full implementation
There was a problem hiding this comment.
The renderer shim is relevant, but the observer also relies on scene/window enumeration, view-hierarchy capture, and frame/display timing behavior. Replacing UIGraphicsImageRenderer alone would not provide a complete AppKit implementation.
For this release, RCTFrameTimingsObserver.mm retains its explicit macOS no-op implementation; it does not claim macOS screenshot-frame capture support. I checked the shared-main candidate and that earlier layer does not contain this observer to forward-port. Full AppKit capture remains a separate follow-up rather than an incomplete renderer-only substitution in the release stack.
| [self clearInitialMessageDelay]; | ||
| [[NSNotificationCenter defaultCenter] removeObserver:self]; | ||
| UIWindow *window = _window; | ||
| RCTPlatformWindow *window = _window; // [macOS] | ||
| _window = nil; | ||
| if (window) { | ||
| RCTExecuteOnMainQueue(^{ | ||
| #if !TARGET_OS_OSX // [macOS] | ||
| window.hidden = YES; | ||
| #else // [macOS] | ||
| [window orderOut:nil]; | ||
| #endif // [macOS] | ||
| }); |
There was a problem hiding this comment.
Does 2b8f46b also need to land on main?
There was a problem hiding this comment.
I checked the current shared-main candidate in #3099: its RCTDevLoadingView.mm does not have this dealloc implementation, so that patch has no corresponding call site there.
The current 0.83 implementation captures an RCTPlatformWindow, clears the ivar, and dismisses it on the main queue using orderOut:nil on macOS and window.hidden = YES on UIKit platforms. The forward-port audit also checked the compatible later implementations and retained their platform guards. This is covered where the method exists rather than introducing a deallocator into an earlier implementation solely to cherry-pick the same hunk.
77af67b to
e063ce9
Compare
|
Note 🤖 OpenCode — This comment was generated by an AI coding agent (OpenCode) at Saad Najmi (@Saadnajmi)'s request. Every claim below was mechanically verified against the repo (patch-id matching plus content inspection), but please treat it as a starting point for review rather than ground truth. One row is explicitly marked unverified. Commit-by-commit: does each local change also need to land on
|
| # | Commit | Subject | Verdict |
|---|---|---|---|
| 1 | 59b2ef1 |
chore(0.83): add minor version plan for 0.83.10 sync | 🚫 0.83-only — superseded 1 commit later by e32ff69 |
| 2 | e32ff69 |
chore(0.83): use changeset instead of nx version-plan | 🚫 0.83-only — release artifact for this sync |
| 3 | ee926ab |
fix(0.83): macOS build + ESLint regressions from 0.83.10 merge | 🚫 N/A — RCTFrameTimingsObserver.mm does not exist on main |
| 4 | dbb0b39 |
fix(ci): derive react_native_version from react-native peer dep | 🍒 Cherry-pick — main still has the buggy form |
| 5 | 4972b56 |
fix(ci): install unpublished virtualized-lists in release-branch gates | 🍒 Cherry-pick — main still does a single yarn pack |
| 6 | 661fd61 |
fix(ci): ignore @react-native/tester in changesets |
🍒 Cherry-pick — |
| 7 | 2b8f46b |
fix(macos): guard UIWindow dealloc in RCTDevLoadingView | ⏭️ Already fixed forward at 0.86 |
| 8 | 7518263 |
fix(ci): fall back to origin remote in changesets base detection | 🍒 Cherry-pick — live bug on main |
| 9 | 7ee8719 |
fix(ci): force transitive virtualized-lists resolution in test-app | 🍒 Cherry-pick |
| 10 | 7684cf0 |
fix(ci): skip published-integration gates for a new minor's first release | 🍒 Cherry-pick — inherited by future -stable branches |
| 11 | 9b6277d |
chore(0.83): use npm trusted publishing | ✅ Already in main as b3a73ab (#3071) |
| 12 | 8fb0a40 |
fix(0.83): point changesets baseBranch at 0.83-stable | 🚫 0.83-only — would break main |
| 13 | 51e83d4 |
fix: prevent dev loading view clipping (#3023) | ✅ Already in main as 78f5b04 |
| 14 | 4f3275e |
docs: update release process for Changesets (#3032) | ✅ Already in main as cc5fac9 |
| 15 | e063ce9 |
feat(rctuikit): Add RCTUITableView for RedboxV1 and RedboxV2 (#3056) | ✅ Already in main as efb2eb5 |
Totals: 4 already in main · 6 to cherry-pick · 1 already fixed forward · 4 not applicable.
Notes on the non-obvious rows
Row 7 — 2b8f46b does not need to land on main. main has no dealloc method in RCTDevLoadingView.mm at all; it arrives from upstream in 0.83.10, so there is nothing to guard. Traced forward along the merge stack:
| Branch | dealloc |
|---|---|
main |
absent |
0.84-merge |
absent |
0.85-merge |
absent |
0.86-merge |
present, already guarded |
0.87-merge |
present, already guarded |
The problem first appears on our mainline at 0.86 and is already handled correctly there. No gap, no cherry-pick needed.
Row 8 — 7518263 is a real bug on main, not hygiene. main currently has:
const remote = (repoPath && remotes.match(...)?.[1]) ?? 'origin';When the regex does not match, repoPath && … evaluates to ''. Since '' is not nullish, ?? never fires and remote becomes the empty string. The fix switches ?? to ||.
Row 12 — deliberately excluded. Cherry-picking the baseBranch change would point main's changesets at origin/0.83-stable. main must keep origin/main.
Row 6 — the one unverified claim. main has "ignore": [] and carries the same private @react-native/tester package (private: true, version 0.83.0-main), so this plausibly applies there too — but I could not prove main needs it without actually running changesets. Treat as a maybe.
Prepared follow-up
A branch of the 6 cherry-picks has been prepared locally on top of main (b3a73ab) — linear, zero conflicts, +59/−18 across 6 files. The four CI script/workflow files come out byte-identical to this PR's head; .changeset/config.json intentionally differs in exactly one line (baseBranch stays origin/main). Not yet pushed.
One thing to decide first
#3026 (chore: minimize the virtualized-lists fork) is open against main and touches the same dependency that rows 5 and 9 work around. If #3026 lands first, those two may become unnecessary or need rework — so these should be sequenced against it.
Unrelated observation
#3056 already landed RCTUITableView on main, and the file contents are byte-identical to the copy carried lower in the 0.84→0.87 merge stack. That means a future rebase onto current main will render those commits empty rather than conflicting — a clean outcome, but expect empty-commit warnings.
Consolidates the superseded version-plan setup into the final Changeset declaration. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
88195ce to
74673ef
Compare
Repairs the 0.83.10 macOS runtime build and DevLoadingView behavior, with the validated dependency lock refresh. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Aligns Changesets, version detection, integration gates, and stable-branch CI behavior for the first 0.83 release. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Adds the reviewed trusted-publishing workflow and disables legacy tag mutation paths. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Documents the Changesets-based stable release and patch release flow. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Consolidates the reviewed RCTUITableView primitives and the AppKit RedBox V1/V2 implementation. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Consolidates Hermes metadata resolution, publication validation, stable package preparation, generated version/API artifacts, Pods, and package metadata. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Consolidates RedBox layout corrections, canonical platform headers, framework dependency paths, and required Apple framework links. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Consolidates portable Hermes assertions, refreshed Pods, branch-neutral release graph checks, and local release-base resolution. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Consolidates exported type generation, private workspace version independence, canonical event declarations, complete Hermes slices, and metadata parsing. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Consolidates the reviewed CI repair and public-registry lock metadata correction. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Fixes RedBox V2 repeat presentation, normalizes macOS diff tags, and restores the Microsoft GitHub Actions ownership convention. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
74673ef to
2e9ca12
Compare
| #if TARGET_OS_OSX // [macOS | ||
| return RCTUITableViewAutomaticDimension; | ||
| #else // macOS] | ||
| auto section = [self sectionForIndex:indexPath.section]; | ||
| if (section == Section::Message || section == Section::CodeFrame) { | ||
| return RCTUITableViewAutomaticDimension; // [macOS] | ||
| } | ||
| return 50; | ||
| #endif // [macOS] |
There was a problem hiding this comment.
We generally always do iOS first
| #if TARGET_OS_OSX // [macOS | ||
| return RCTUITableViewAutomaticDimension; | ||
| #else // macOS] | ||
| if (indexPath.section == 0) { |
There was a problem hiding this comment.
We generally do iOS first
| #if TARGET_OS_OSX // [macOS | ||
| // Create the table before reloading it on the first presentation. | ||
| (void)self.view; | ||
| #endif // macOS] | ||
| [_stackTraceTableView reloadData]; |
There was a problem hiding this comment.
This diff seems off?
| @@ -42,7 +41,7 @@ Pod::Spec.new do |s| | |||
| s.dependency "React-perflogger", version | |||
| s.dependency "React-jsi", version | |||
| s.dependency "React-logger", version | |||
| s.dependency "React-debug", version | |||
| add_dependency(s, "React-debug", :version => version) | |||
There was a problem hiding this comment.
These diffs seem larger than we'd like for React Native macOS? Build specs (pod specs in this case) I like to keep as even as possible
| "USE_HEADERMAP" => "YES", | ||
| "CLANG_CXX_LANGUAGE_STANDARD" => rct_cxx_language_standard(), | ||
| "GCC_WARN_PEDANTIC" => "YES" } | ||
| s.frameworks = "CoreGraphics" |
There was a problem hiding this comment.
macOS tag
Current release stack
0.83-stable. Retarget as predecessors land; stable releases retain separate stable branches.RNM 0.83.0 with RN 0.83.10. Publish and verify before the next minor.
Validation and backups
The branch-specific repaired source passed hardened immutable installation, constraints, and its complete release-helper selection. The selected 18-head packet records 1,406 passing helper tests. Exact source-tree equivalence is used for rewritten endpoints where applicable; the two changed linear RC checkpoints were tested separately.
Native/API evidence retains its recorded scope. The SwiftPM and RNTester repairs have six focused native build passes. Public stable versions and runtime/API contents were preserved except for the independently reviewed SwiftPM destination repair where applicable.
Public-registry lock correction passed all 18 hosted generation, hardened immutable, constraints, and metadata-audit jobs in run 35769816507. Only equivalent executable-path spelling changes are permitted; dependency versions, checksums, and ranges are unchanged. The previous functional test results remain applicable to this metadata-only correction. Fresh GitHub CI and review remain required. Previous heads are preserved on the same repository under
backup/pre-ci-repair-20260922/<original-branch>andbackup/pre-public-registry-20260922/<original-branch>; local complete-history bundles were verified as well.The 0.87 PR sequence is one first-parent path: #3037 → #3104 → #3105 → #3106 → #3100 → #3101 → #3107. The redundant #3102/#3103 reviews are consolidated into #3105.
This section supersedes earlier stack order, source identity, and validation-status notes below.
Summary
This is the single 0.83 stable-line PR for both the upstream sync and the effective RedBox 2.0/AppKit backport. It supersedes #3027.
Provenance
The four additive commits are stacked on the previously reviewed #3022 head:
The V1 adaptation is byte-identical to #3027. Every other changed implementation file is byte-identical to the reviewed #3054 production stack. Native RCTUITableView tests and their project wiring are intentionally excluded, matching the repository-owner review decision on #3056.
Validation
EXIT=0,** BUILD SUCCEEDED **)d7f6c18b7d570d06a79297c774e6343a92e178910374ea9ab5a99d8ac77aad4e842 / 144 / 16total lines / fork lines / top-level macOS guardsmanual macOS RedBox 2.0 OFF/ON verification OUTSTANDING; do not undraft until performed
The bounded manual attempt could not obtain a script URL in the DerivedData-built app even with Metro ready and serving the bundle, so no manual OFF or ON behavior item is claimed as passed.